﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Sistema_Totem.Datos.SqlServer;
using Sistema_Totem.Logica.Excepciones;

namespace Sistema_Totem.Logica.Clases
{
    public class Usuario:Persona
    {
        private int id;
        private String nickname;
        private String clave;
        private Rol rol;

        #region Constructor

        public Usuario()
        {
           this.Rol = new Rol();
        }

        public Usuario(int id, String nickname, String nombre, String clave, String correo, String telefono, Rol rol)
        {
            this.Id = id;
            this.Nickname = nickname;
            this.Nombre = nombre;
            this.clave = clave;
            this.Telefono = telefono;
            this.Rol = new Rol();
            this.Rol = rol; 
            this.Correo = correo;
        }
        
        #endregion Constructor

        #region Getter y setter

        public int Id
        {
            get { return id; }
            set { id = value; }
        }

        public String Nickname
        {
            get { return nickname; }
            set { nickname = value; }
        }

        public String Clave
        {
            get { return clave; }
            set { clave = value; }
        }

        public Rol Rol
        {
            get { return rol; }
            set { rol = value; }
        }
        #endregion Getter y setter

        #region Metodos

        #region AgregarUsuario

        public int AgregarUsuario(Usuario usuario)
        {
            try
            {
                int idVerificacion = 0;
                // instanciamos un objeto de tipo SqlServerUsuario
                SqlServerUsuario serverUsuario = new SqlServerUsuario();
                // llamamos al metodo AgregarUsuario pasando por parametro el objeto del tipo Usuario
                int idRetornado = serverUsuario.AgregarUsuario(usuario);
                // verificamos que el id que retorna la insercion sea distinta de "cero" la insercion fue exitosa
                if (idVerificacion != 0)
                {
                    idVerificacion = idRetornado;
                }
                else
                {   // en el caso contrario si el id que retorna es igual "cero" la insercion fallo
                    if (idVerificacion == 0)
                    {
                        idVerificacion = idRetornado;
                    }
                }
                // retornamos la respuesta de la verificacion de la insercion
                return idVerificacion;
            }
            catch (NullReferenceException error)
            {
                throw (new UsuarioExcepcion("Error al pasar los datos :", error));
            }
        }

        #endregion AgregarUsuario

        #region ModificarUsuario

        public int ModificarUsuario(Usuario usuario)
        {
            try
            {
                int idVerificacion = 0;
                // instanciamos un objeto de tipo SqlServerUsuario
                SqlServerUsuario serverUsuario = new SqlServerUsuario();
                // llamamos al metodo ModificarUsuario pasando por parametro el objeto del tipo Usuario
                int idRetornado = serverUsuario.ModificarUsuario(usuario);
                // verificamos que el id que retorna la modificacion sea distinta de "cero" la modificacion fue exitosa
                if (idVerificacion != 0)
                {
                    idVerificacion = idRetornado;
                }
                else
                {   // en el caso contrario si el id que retorna es igual "cero" la modificacion fallo
                    if (idVerificacion == 0)
                    {
                        idVerificacion = idRetornado;
                    }
                }
                // retornamos la respuesta de la verificacion de la modificacion
                return idVerificacion;
            }
            catch (NullReferenceException error)
            {
                throw new UsuarioExcepcion("Error al pasar los datos ", error);
            }
        }
        #endregion ModificarUsuario

        #region VerificarConsultarUsuario

        public int VerificarConsultarUsuario(String nombreRol)
        {
            int verificar = 0;
            try
            {
                List<Usuario> listaUsuario = new List<Usuario>();
                listaUsuario = ConsultartodosTodosUsuarios();
                if (listaUsuario != null)
                {
                    foreach (Usuario usuario in listaUsuario)
                    {
                        if (usuario.Rol.Nombre == nombreRol)
                            verificar = 1;
                    }
                }
            }
            catch (NullReferenceException error)
            {
                throw new UsuarioExcepcion("El valor que devuelve es null", error);
            }
       

            return verificar;
        }
        #endregion VerificarConsultarUsuario

        #region ConsultarTodosUsuario

        public List<Usuario> ConsultartodosTodosUsuarios()
        {
            SqlServerUsuario serverUsuario = new SqlServerUsuario();
            try
            {
                return serverUsuario.ConsultarUsuarios();
            }
            catch (NullReferenceException e)
            {
                throw new NullReferenceException("El valor que devuelve la lista es vacio");
            }
            catch (Exception e)
            {
                throw new Exception("Error en la conexión", e);
            }
        }

        #endregion ConsultarTodosUsuario

        #region validarUsuario

        public Usuario validarUsuario(String usuario, String Password)
        {
            Usuario _u = new Usuario();
            List<Usuario> _lista = new List<Usuario>();
            try
            {
                _lista = ConsultartodosTodosUsuarios();
                for (int i = 0; i < _lista.Count; i++)
                {
                    _u = _lista[i];
                    if ((_u.Nickname.Equals(usuario)) && (_u.Clave.Equals(Password)))
                    {
                        return _u;
                    }
                }
            }
            catch (NullReferenceException e)
            {
                throw new NullReferenceException("Error en conexion a Base de Datos", e);
            }
            catch (Exception e)
            {
                throw new Exception("Error devolviendo nickname", e);
            }
            return _u = null;
        }

        #endregion validarUsuario

        #endregion Metodos
    }
}